package com.ai.annotation.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @Author jiaok
 * @Date 2023-09-13 11:14
 */
@Aspect
@Component
public class ServiceLogAspect {

    public static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);

    /**
     * execution 代表所要执行的表达式主体
     * 第一处 *代表方法返回类型*代表 所有类型
     * 第二处 包名代表aop监控的类所在的包
     * 第三处 .. 代表该包以及其子包下的所有类方法
     * 第四处 *代表类名，*代表所有类
     * 第五处 *(..)*代表类中的方法名，(..)表示方法中的任何参数
     * @param joinPoint 切点
     * @return
     * @throws Throwable
     */
    @Around("execution(* com.ai.service.*..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {

        logger.info("==============================  开始执行 {}.{}  ================================="
                          //获取正在执行的类
                        ,joinPoint.getTarget().getClass()
                           //获取执行的方法名
                        ,joinPoint.getSignature().getName()
                 );

        long beginTimes = System.currentTimeMillis();

        Object result = joinPoint.proceed();

        long endTimes = System.currentTimeMillis();

        long runTimes = endTimes - beginTimes;

        if (runTimes > 5000){
            logger.error("==============================  执行  {},{}  结束 ，耗时{}ms  ================================="
                    //获取正在执行的类
                    ,joinPoint.getTarget().getClass()
                    ,joinPoint.getSignature().getName()
                    ,runTimes);
        } else  {
            logger.info("==============================  执行  {}.{}  结束 ，耗时{}ms  ================================="
                    //获取正在执行的类
                    ,joinPoint.getTarget().getClass()
                    ,joinPoint.getSignature().getName()
                    ,runTimes);
        }
        return result;
    }
}
